/*

cimahis - Software para el analisis de imagenes de corte histologico

Copyright (C) Andrés De Abreu 2010 <jadabreu @ gmail . com>


Este programa es software libre. Puede redistribuirlo y/o modificarlo bajo los términos
de la Licencia Pública General de GNU según es publicada por la Free Software Foundation,
bien de la versión 2 de dicha Licencia o bien (según su elección) de cualquier versión
posterior.

Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA,
incluso sin la garantía MERCANTIL implícita o sin garantizar la CONVENIENCIA PARA UN
PROPÓSITO PARTICULAR. Véase la Licencia Pública General de GNU para más detalles.

Debería haber recibido una copia de la Licencia Pública General junto con este programa.
Si no ha sido así, escriba a la Free Software Foundation, Inc.,
en 675 Mass Ave, Cambridge, MA 02139, EEUU.

    //ACERCA DE elegirFiltros.cpp
    *
    * Declaracion de la clase que construye la interfaz grafica para la aplicación de
    * los filtros.

*/


#include "color/AplicarFiltros/elegirFiltros.h"
#include "ui_elegirFiltros.h"
#include "fstream"
#include <iostream>
#include "vector"
#include <QProgressDialog>
#include "threadFiltro.h"



using namespace std;

elegirFiltros::elegirFiltros(QWidget *parent) : //constructor
    QDialog(parent),
    ui(new Ui::elegirFiltros)
{
    ui->setupUi(this);
}

elegirFiltros::~elegirFiltros() //destructor
{
    delete ui;
}

void elegirFiltros::changeEvent(QEvent *e) //función generada automaticamente por QT parar controlar los eventos
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void elegirFiltros::paintEvent(QPaintEvent *) //evento que se lanza cuando se pinta la interfaz grafica
{
    QRectF target(0,0, 300, 304); // Coordenadas de donde kieres imagen x,y,ancho,alto

}

void elegirFiltros::cargarImagen(IplImage * img) //metodo para la carga de la imagen que se desea filtrar
{
    origen=img;
    vistaPrevia=cvCreateImage(cvGetSize(img),img->depth,img->nChannels);
    vistaPrevia=cvCloneImage(img);

    imagenInterfaz=IplImageToQImage(img);
    ui->label_2->setPixmap(QPixmap::fromImage(*imagenInterfaz)); //porner imagenInterfaz en la sección de vista previa
    ui->label_2->setScaledContents(false);
}

void elegirFiltros::cargarFiltros() //cargar los datos del archivo filtros.on
{

    f=0;


    string aux,aux1,aux2;
    int aux3,temp;
    ifstream in("color/datosFiltros.in");
    QString nombreFiltro;
    QListWidgetItem* nuevoFiltro[10];
    int i=0;


    if(in.bad())
    {
        cajaAviso.setText("Error al cargar los filtros.. archivo dañado.");
        cajaAviso.exec();
    }

    while(in >> aux >> aux1 >> aux2 >> aux3)
    {
        nuevoFiltro[i]= new QListWidgetItem();

        for(int j=0;j<aux3;j++)
        {
            in >> temp;

        }

        nombreFiltro.append(aux.c_str());
        nuevoFiltro[i]->setText(nombreFiltro);
        ui->listWidget->insertItem(i,nuevoFiltro[i]);
        i++;
        nombreFiltro.clear();
    }

    in.close();
}

void elegirFiltros::cambiarParametros()
{
    if (f==0)
    {
        cajaAviso.setText("Debe elegir un filtro primero.");
        cajaAviso.exec();
    }
    else
    {
        vf = new ventanaParametrosFiltro();
        vf->cargarDatosFiltro(f->obtenerTamanoKernel(),f->obtenerParametrosExtra(),f->obtenerNParametrosExtra(), f->obtenerNombre());
        vf->leerFiltro(f);
        vf->show();

    }


}

void elegirFiltros::actualizarVistaPrevia() //actualizar la vista previa del fitro seleccionado
{

    threadFiltro hilo;

    QProgressDialog *pd = new QProgressDialog("Procesando imagen...","OK", 0, 0);

    pd->setCancelButton(0);
    pd->show();
    qApp->processEvents( );


    cvCopy(origen,vistaPrevia,0);

    hilo.pasarDatos(f,vistaPrevia);
    hilo.start();
    while(hilo.isRunning())
    {
        qApp->processEvents( );
    }
    hilo.wait();
    imagenFiltrada = IplImageToQImage(vistaPrevia);
    ui->label_2->setPixmap(QPixmap::fromImage(*imagenFiltrada));

    pd->close();
}

void elegirFiltros::on_listWidget_itemClicked(QListWidgetItem* item) //acción que se dispara cuando se hace click en algun filtro de la lista
{
    QString tipo=item->text();
    string tipoF=tipo.toStdString();

     f=ff.crearFiltro(tipoF);

    this->actualizarVistaPrevia();

}

void elegirFiltros::restaurarImagen() //restaurar la vista previa
{
    imagenInterfaz=IplImageToQImage(origen);
     ui->label_2->setPixmap(QPixmap::fromImage(*imagenInterfaz));


     cvCopy(origen,vistaPrevia,0);
}

void elegirFiltros::cargarArea(areaImagen *a) //cargar el areaImagen donde sera cargada la imagen filtrada
{
    area=a;
}



void elegirFiltros::on_buttonBox_accepted() //acción que se dispara cuando se hace click en aceptar
{
    QProgressDialog *pd = new QProgressDialog("Procesando imagen...","OK", 0, 0);
    pd->setCancelButton(0);
    pd->show();
    qApp->processEvents( );

    threadFiltro hilo;

    hilo.pasarDatos(f,origen);
    hilo.start();
    while(hilo.isRunning())
    {
        qApp->processEvents( );
    }
    hilo.wait();


    area->modificarArea(origen);
    area->modificarImagenCvAux(origen);


    this->close();
     pd->hide();
     area->show();
     area->setWindowTitle(area->windowTitle()+"(filtrada)");
}


